package com.stdspringboot.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//由spring容器管理，该类不属于Controller、Service、Repository，所以用@Component注解
@Component
//表明该类为切面类
@Aspect
public class Logger {
    /*
    在 top.malaoshi.controller 包下的类 的 方法，都能注入代码
     */
    @Pointcut("execution(* com.stdspringboot.ctrl.*.*(..))")
    public void pt(){
    }
    /*
    在 top.malaoshi.controller 包下的类 的 方法，执行之前 会先执行下面方法
     */
    @Before("pt()")
    public void beforePrint(){
        System.out.println("=======before");
    }
    /*
    在 top.malaoshi.controller 包下的类 的 方法，执行之后（不论是否抛异常） 会执行下面方法
     */
    @After("pt()")
    public void afterPrint(){
        System.out.println("======after");
    }
    /*
    在 top.malaoshi.controller 包下的类 的 方法，执行之后（没抛异常） 会执行下面方法
     */
    @AfterReturning("pt()")
    public void afterReturningPrint(){
        System.out.println("======afterReturning");
    }
    /*
    在 top.malaoshi.controller 包下的类 的 方法，执行之后（抛异常了） 会执行下面方法
     */
    @AfterThrowing("pt()")
    public void afterThrowingPrint(){
        System.out.println("======异常通知afterThrowingPrint");
    }


//    @Around("pt()")
//    public void aroundPrint(){
//        System.out.println("======around");
//    }

    @Around("pt()")
    public Object aroundPrint(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("======around开始");
        //获取传入的目标方法的参数
        Object[] array=pjp.getArgs();
        //调用目标方法，并返回结果
        Object res=null;
        try {
            //可以决定是否调用目标方法
            res = pjp.proceed(array);//调用目标方法
            System.out.println("======around 目标方法正常结束");
        }catch (Throwable e){
            System.out.println("======around捕捉异常");
            throw e;
        }
        System.out.println("========around最终结束");
        return res;
    }


}
